package concreto.redeneural;

import java.util.ArrayList;
import java.util.List;

import comportamento.neuronio.INeuronioAbstrato;
import comportamento.neuronio.IPerceptron;
import comportamento.redeneural.ICamadaNeuralPerceptron;

import concreto.neuronio.PerceptronSimples;

public class CamadaNeuralPerceptron implements ICamadaNeuralPerceptron {

    private List<IPerceptron> perceptrons = new ArrayList<IPerceptron>();

    public void adicionarPerceptron(IPerceptron neuronio) {

	perceptrons.add(neuronio);
    }

    public void removerPerceptron(IPerceptron neuronio) {

	perceptrons.remove(neuronio);
    }

    public double[] estimular(double[] estimulos) {

	int quantidadeEstimulos = estimulos.length;
	double[] estimulacao = new double[quantidadeEstimulos];
	double[] saidas = null;

	int aux = 0;
	int saidas_aux = 0;

	for(IPerceptron n : perceptrons) {

	    estimulacao[aux++] = n.estimular(estimulos);
	    saidas_aux++;
	}

	saidas = new double[saidas_aux];

	for(int i = 0; i < saidas_aux; i++) {
	    saidas[i] = estimulacao[i];
	}

	return saidas;
    }

    public void treinar(double[][] treino, double[][] saidas) {

	double[][] tr = treino;
	int entradas = tr.length;

	for(int i = 0; i < entradas; i++) {
	    PerceptronSimples p = new PerceptronSimples(0);
	    p.selecionarFuncaoAtivacao(INeuronioAbstrato.ATIVACAO_SINAL);
	    adicionarPerceptron(p);
	}

	for(int i = 0; i < entradas; i++){

	    for(int j = 0; j < entradas; j++){

		IPerceptron p = perceptrons.get(j);
		p.treinar(new double[][] {tr[i]}, new double[] {saidas[i][j]});
	    }

	    double[] ss = this.estimular(tr[i]);
	    String resultado = "[";

	    for(double s : ss) {
		resultado = resultado.concat(String.valueOf(s)).concat(",");
	    }

	    resultado = resultado.substring(0, resultado.length()-1).concat("]");
	    System.out.println(resultado);

	}
    }


    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {

	StringBuffer b = new StringBuffer("");
	int contNeuronios = 1;

	for(IPerceptron n : perceptrons) {
	    b.append("\n\n[Neuronio " + (contNeuronios++) + "]\n");
	    b.append(n);
	}

	return b.toString();
    }

}
